package fdupc.date;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;

/**
 * 类描述:  日期处理
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/9/20 0020 下午 1:41
 */
@Slf4j
public class DateUtil {


    /**
     * 功能描述：日期处理
     *
     * @param date        需要处理的日期
     * @param managerType 是否处理为开始时间；<=0：开始时间处理；>0：结束时间处理
     * @return 处理结果
     * @date: 2022/3/24 0024 下午 8:39
     */
    public static Date dateStartOrEndManager(String date, int managerType) throws ParseException {
        return dateStartOrEndManager(new SimpleDateFormat("yyyy-MM-dd").parse(date), managerType);
    }

    /**
     * 功能描述：日期处理
     *
     * @param date        需要处理的日期
     * @param managerType 是否处理为开始时间；<=0：开始时间处理；>0：结束时间处理
     * @return 处理结果
     * @date: 2022/3/24 0024 下午 8:39
     */
    public static Date dateStartOrEndManager(Date date, int managerType) {
        date = date == null ? new Date() : date;
        LocalTime localTimeType = LocalTime.MIN;
        if (managerType > 0) {
            localTimeType = LocalTime.MAX;
        }
        return Date.from(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().with(localTimeType)
                .atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 功能描述：获取当前时间
     *
     * @return 当前时间（LocalDate格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static LocalDate giveLocalDateNow() {
        return LocalDate.now();
    }

    /**
     * 功能描述：获取当前时间
     *
     * @return 当前时间（LocalDateTime格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static LocalDateTime giveLocalDateTimeNow() {
        return LocalDateTime.now();
    }

    /**
     * 功能描述：根据日期获取LocalDateTime对象
     *
     * @date: 2022/10/2 0002 下午 9:13
     */
    public static LocalDateTime giveLocalDateTime(String dataTime) {
        return !StringUtils.isNotBlank(dataTime) ? giveLocalDateTimeNow()
                : LocalDateTime.parse(dataTime, DateUtilConstant.giveDateTime());
    }

    /**
     * 功能描述：获取当天开始时间
     *
     * @return 当前时间（LocalDateTime格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static LocalDateTime giveLocalDateTimeNowStart(String dataTime) {
        return giveLocalDateTime(dataTime).with(LocalTime.MIN);
    }

    /**
     * 功能描述：获取当天开始时间
     *
     * @return 当前时间（LocalDateTime格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static LocalDateTime giveLocalDateTimeNowEnd(String dataTime) {
        return giveLocalDateTime(dataTime).with(LocalTime.MAX);
    }

    /**
     * 功能描述：获取当天开始时间
     *
     * @return 当前时间（Date格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static Date giveDateTimeNowStart(String dataTime) {
        return Date.from(giveLocalDateTimeNowStart(dataTime).atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 功能描述：获取当天开始时间
     *
     * @return 当前时间（Date格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static Date giveDateTimeNowEnd(String dataTime) {
        return Date.from(giveLocalDateTimeNowEnd(dataTime).atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 功能描述：获取当天开始时间月
     *
     * @return 当前时间（LocalDateTime格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static LocalDateTime giveLocalDateTimeMonthStart(String dataTime) {
        return giveLocalDateTime(dataTime).with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
    }

    /**
     * 功能描述：获取当天开始时间
     *
     * @return 当前时间（LocalDateTime格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static LocalDateTime giveLocalDateTimeMonthNowEnd(String dataTime) {
        return giveLocalDateTime(dataTime).with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
    }

    /**
     * 功能描述：获取当月第一天开始时间
     *
     * @return 当前时间（Date格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static Date giveDateTimeMonthStart(String dataTime) {
        return Date.from(giveLocalDateTimeMonthStart(dataTime).atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 功能描述：获取当月最后一天结束时间
     *
     * @return 当前时间（Date格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static Date giveDateTimeMonthEnd(String dataTime) {
        return Date.from(giveLocalDateTimeMonthNowEnd(dataTime).atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 功能描述：获取当前时间
     *
     * @param isDispTime 是否时间介入；True：时间；False：无时间
     * @return 当前时间（Date格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static Date giveDateNow(boolean isDispTime) {
        if (!isDispTime) {
            return Date.from(giveLocalDateNow().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
        }
        return Date.from(giveLocalDateTimeNow().atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 功能描述：获取当前时间
     *
     * @param dataValue 是否时间介入；True：时间；False：无时间
     * @return 当前时间（Date格式）
     * @date: 2022/10/2 0002 下午 8:16
     */
    public static Date giveStrToDate(String dataValue, String formatValue) throws ParseException {
        return DateUtilConstant.giveSimpleDateFormat(formatValue).parse(dataValue);
    }

    /**
     * 功能描述：日期转字符串
     *
     * @param date 需要转换的日期
     * @return 处理后的结果
     * @date: 2022/10/5 0005 下午 1:50
     */
    public static String giveDataToString(Date date) {
        return DateUtilConstant.giveDateTime().format(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()));
    }

    /**
     * 功能描述：日期转字符串
     *
     * @return 处理后的结果
     * @date: 2022/10/5 0005 下午 1:50
     */
    public static String giveDataNowToString() {
        return giveDataToString(new Date());
    }

    /**
     * 格式化指定时间
     */
    public static String format(Date date, String pattern) {
        SimpleDateFormat p = new SimpleDateFormat(pattern);
        return date == null ? "" : p.format(date);
    }

    /**
     * 功能描述：时间计算
     *
     * @param cycle 需要运算的值，单位：秒
     * @date: 2022/10/11 0011 下午 5:48
     */
    public static LocalDateTime localDateTimeCalculate(Long cycle) {
        return LocalDateTime.now().plusSeconds((cycle == null) ? 0 : cycle);
    }

    /**
     * 功能描述：时间计算
     *
     * @param cycle 需要运算的值，单位：秒
     * @date: 2022/10/11 0011 下午 5:48
     */
    public static Date dateCalculate(Long cycle) {
        return Date.from(localDateTimeCalculate(cycle).atZone(ZoneId.systemDefault()).toInstant());
    }
}
